function evento_AlojamientoForm() {
	
	var INPUT_NOMBRE_FORM = "alojamiento\\.hotel\\.nombre";
	var ID_HOTEL_FORM = "alojamiento\\.hotel\\.id";
	var CREAR_ACTUALIZAR_BUTTON = "crear_actualizar_hotel";
	var NUEVO_HOTEL_BUTTON_LABEL = "Nuevo Hotel"
	var ACTUALIZAR_HOTEL_BUTTON_LABEL = "Actualizar Hotel"
	var AGREGAR_ALOJAMIENTO_BUTTON = "agregar_alojamiento";
	var ALOJAMIENTOS_AGREGADOS = "alojamientos";
	var FORM_MESSAGE_ID = "mensaje";
	var FORM_ALOJAMIENTO = "form_alojamiento";	
	var ELIMINAR_ALOJAMIENTO_BUTTON_CLASS = "alojamiento_cancel";
	var EDITAR_ALOJAMIENTO_BUTTON_CLASS = "alojamiento_editar";
	
	var ID_ATTRIBUTE = "alojamiento[]id";
	var HOTEL_NOMBRE_ATTRIBUTE = 	"alojamiento[]hotel[]nombre";
	var HOTEL_ID_ATTRIBUTE = 	"alojamiento[]hotel[]id";
	var CANTHAB_SIMPLE_ATTRIBUTE = "alojamiento[]cantidadHabitacionSimple";
	var CANTHAB_DOBLE_ATTRIBUTE = "alojamiento[]cantidadHabitacionDoble";
	var CANTHAB_OTRA_ATTRIBUTE = "alojamiento[]cantidadHabitacionOtra";
	var PRIMER_VENC_ATTRIBUTE = "alojamiento[]vencimiento1"; 
	var SEGUNDO_VENC_ATTRIBUTE = "alojamiento[]vencimiento2"; 
	var TERCER_VENC_ATTRIBUTE = "alojamiento[]vencimiento3"; 
	
	var alojamientoTmpl;
	
	var hoteles;	
	
	var hotelForm = new evento_HotelForm();
	
	var buscarHotelesServiceUrl;
	
	var altaHotelServiceUrl;
	
	var actualizarServiceUrl;
	
	var alojamientoForm = document.getElementById(FORM_ALOJAMIENTO);
	
	this.setAlojamientoTmpl = function(template){
		alojamientoTmpl = template;
	}
	this.setHoteles = function(dataHoteles) {
		hoteles = dataHoteles;
	} 
	this.setBuscarHotelesServiceUrl = function(buscarHotelesUrl) {
		buscarHotelesServiceUrl = buscarHotelesUrl;
	}
	this.setAltaHotelServiceUrl = function(altaHotelUrl) {
		altaHotelServiceUrl = altaHotelUrl;
		hotelForm.setAltaServiceUrl(altaHotelServiceUrl);
		
	}
	this.setActualizarServiceUrl= function(actualizarHotelUrl) {
		actualizarServiceUrl = actualizarHotelUrl;
		hotelForm.setActualizarServiceUrl(actualizarServiceUrl);
	}
	
	var servicioBuscarHotelSuccessCallBack = function(data){
		console.log("se obtuvieron hoteles: "+data.length);
		hoteles = data;
	}
	
	var servicioBuscarHotelErrorCallBack = function(data){
		servicioErrorMensaje("#mensaje", "Ocurri&oacute; un error en la busqueda de hoteles", data);
	};
	
	var data_hotelesFilter = function (texto) {
    	var matcher = new RegExp( texto, "i" );
        var resultados = $.grep( hoteles, function(item,index){
            return matcher.test(item.nombre);
        });
        return resultados;
    }
	
	var actualizarListadoHoteles = function() {
		jQuery.ajax({
            type : 'GET',
            url : buscarHotelesServiceUrl,
            contentType : 'application/json',
            dataType : 'json',
            success : servicioBuscarHotelSuccessCallBack,
            error : servicioBuscarHotelErrorCallBack
    
		});
	}
	this.actualizarAlojamientos = function (data_alojamientos) {
		$("#alojamientos dt").each(function(){
			$(this).next("dd").remove();
			$(this).remove();
		});
		var fecha;
		for(var i=0; i < data_alojamientos.length; i++) {
			
			if ( !isNaN(data_alojamientos[i].vencimiento1) && data_alojamientos[i].vencimiento1.length > 0){
				fecha  = new Date(data_alojamientos[i].vencimiento1);	
				data_alojamientos[i].vencimiento1 = fecha.getDate() + "-" + (fecha.getMonth()+1) + "-" + fecha.getFullYear();
			}
			if ( !isNaN(data_alojamientos[i].vencimiento2) && data_alojamientos[i].vencimiento2.length > 0){
				fecha  = new Date(data_alojamientos[i].vencimiento2);	
				data_alojamientos[i].vencimiento2 = fecha.getDate() + "-" + (fecha.getMonth()+1) + "-" + fecha.getFullYear();
			}
			if ( !isNaN(data_alojamientos[i].vencimiento3) && data_alojamientos[i].vencimiento3.length > 0){
				fecha  = new Date(data_alojamientos[i].vencimiento3);	
				data_alojamientos[i].vencimiento3 = fecha.getDate() + "-" + (fecha.getMonth()+1) + "-" + fecha.getFullYear();
			}
			
			$("#"+alojamientoTmpl).tmpl( [data_alojamientos[i]]).appendTo("#"+ALOJAMIENTOS_AGREGADOS);
	    	$("#"+data_alojamientos[i].id).data("data_alojamiento", data_alojamientos[i]);
        }
	}
	
	this.actualizarComboHoteles = actualizarListadoHoteles;
	
	
	
	hotelForm.setAltaServiceUrl(altaHotelServiceUrl);
	
	hotelForm.setActualizarServiceUrl(actualizarServiceUrl);
	
	hotelForm.setAfterChangeCallback(function(hotel) {
		actualizarListadoHoteles();
        $("#"+INPUT_NOMBRE_FORM).val(hotel.nombre);
        $("#"+ID_HOTEL_FORM).val(hotel.id);
        $("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', ACTUALIZAR_HOTEL_BUTTON_LABEL);
    });
	
	
	
	$("#"+CREAR_ACTUALIZAR_BUTTON).click(function() {
		var id = $("#"+ID_HOTEL_FORM).val();
		if (id == null || $.trim(id).length == 0) {
			hotelForm.abrirFormularioAlta($("#"+INPUT_NOMBRE_FORM).val());
		} else {
			for(var i=0; i < data_hoteles.length; i++) {
                 if (hoteles[i].id == id){
                	 hotelForm.abrirFormularioActualizacion(data_hoteles[i]);
                     break;
                 }
            }
		}
		return false;
    });
	
	
	$("#"+INPUT_NOMBRE_FORM).autocomplete({
		delay: 0,
		source: function(req, responseFn) {
	        var texto = $.ui.autocomplete.escapeRegex(req.term);
	        responseFn( data_hotelesFilter(texto) );
	    },
        focus: function( event, ui ) {
            $( "#"+INPUT_NOMBRE_FORM ).val( ui.item.nombre );
            return false;
        },
        select: function( event, ui ) {
        	$( "#"+INPUT_NOMBRE_FORM ).val( ui.item.nombre );
            return false;
        },
        change: function(){
            var value = $.trim($(this).val());
            if (value.length == 0){
                //No selecciono ninguno
                $( "#"+ID_HOTEL_FORM ).val("");
                $("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', NUEVO_HOTEL_BUTTON_LABEL);
            } else {
                var resultados = data_hotelesFilter(value);
                if ((resultados.length == 1) && (resultados[0].nombre.toLowerCase() == value.toLowerCase()) ){
                    //Existe el campo ingresado
                    $( "#"+ID_HOTEL_FORM ).val(resultados[0].id);
                    $("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', ACTUALIZAR_HOTEL_BUTTON_LABEL);
                } else {
                    $( "#"+ID_HOTEL_FORM ).val("");
                    $("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', NUEVO_HOTEL_BUTTON_LABEL);
                }
            }
        }
        
    }).data( "autocomplete" )._renderItem = function ( ul, item ) {
        return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<a>" + item.nombre + "</a>" )
        .appendTo( ul );
    };
    
    $("#"+AGREGAR_ALOJAMIENTO_BUTTON).click(function(){
    	var $formulario = $("#"+FORM_ALOJAMIENTO);
    	if (!$formulario.valid()){
 	        return false;
 	    }    	    	
    	var alojamiento = $formulario.serializeObject().alojamiento;
    	
    	
    	if(alojamiento.id.length ==0) {
    		alojamiento.id = "alojamientoId_"+ (new Date()).getTime();
    	}
    	//$.tmpl(alojamientoTmpl, [alojamiento]).appendTo( "#"+ALOJAMIENTOS_AGREGADOS );
    	 $("#"+alojamientoTmpl).tmpl( [alojamiento]).appendTo("#"+ALOJAMIENTOS_AGREGADOS);
    	 
    	 $("#"+alojamiento.id).data("data_alojamiento", alojamiento);
    	 $formulario[0].reset();
    	 $("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', NUEVO_HOTEL_BUTTON_LABEL);
    	return false;
    })
    $("."+ELIMINAR_ALOJAMIENTO_BUTTON_CLASS).live("click",function(){
    	var $dt = $(this).parent().parent();
    	$dt.next("dd").remove();
    	jQuery.removeData($dt, "data_alojamiento");
    	$dt.remove();
    	return false;
	});
    
    $("."+EDITAR_ALOJAMIENTO_BUTTON_CLASS).live("click",function(){
    	var $dt = $(this).parent().parent();
    	var alojamiento = $dt.data("data_alojamiento");
    	var alojamientoForm = document.getElementById(FORM_ALOJAMIENTO);
    	
    	alojamientoForm.elements[ID_ATTRIBUTE].value = alojamiento.id;
    	alojamientoForm.elements[HOTEL_NOMBRE_ATTRIBUTE].value =  alojamiento.hotel.nombre;	
    	alojamientoForm.elements[HOTEL_ID_ATTRIBUTE].value = alojamiento.hotel.id;
    	alojamientoForm.elements[CANTHAB_SIMPLE_ATTRIBUTE].value = alojamiento.cantidadHabitacionSimple;
    	alojamientoForm.elements[CANTHAB_DOBLE_ATTRIBUTE].value = alojamiento.cantidadHabitacionDoble;
    	alojamientoForm.elements[CANTHAB_OTRA_ATTRIBUTE].value = alojamiento.cantidadHabitacionOtra;
        alojamientoForm.elements[PRIMER_VENC_ATTRIBUTE].value = alojamiento.vencimiento1;
        alojamientoForm.elements[SEGUNDO_VENC_ATTRIBUTE].value = alojamiento.vencimiento2;
        alojamientoForm.elements[TERCER_VENC_ATTRIBUTE].value = alojamiento.vencimiento3;
    					
        $dt.next("dd").remove();
        $dt.removeData("data_alojamiento");
    	$dt.remove();
    	$("#"+CREAR_ACTUALIZAR_BUTTON).button('option', 'label', ACTUALIZAR_HOTEL_BUTTON_LABEL);
	});
    
	
	function servicioErrorMensaje(selectorContenedor, mensaje,data) {
        var $mensaje = $(selectorContenedor);
        $mensaje.removeClass("mensaje");
        $mensaje.addClass("error");
        $mensaje.html(mensaje);
        
        $mensaje.parent().removeClass("contenedor_mensaje");
        $mensaje.parent("contenedor_mensaje_error").addClass();
        $mensaje.parent().show();        
	}
    function servicioSuccessMensaje(selectorContenedor, mensaje) {
        var $mensaje = $(selectorContenedor);
        $mensaje.removeClass("error");
        $mensaje.addClass("mensaje");
        $mensaje.html(mensaje);
        $mensaje.parent().removeClass("contenedor_mensaje_error");
        $mensaje.parent().addClass("contenedor_mensaje");
        $mensaje.parent().show();
    }
}